Code coverage report for src/bindable-property.js

Statements: 34.9% (52 / 149)      Branches: 19.7% (13 / 66)      Functions: 42.86% (12 / 28)      Lines: 34.69% (51 / 147)      Ignored: none     

All files » src/ » bindable-property.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 2771     1   2   1                     1   1   1   280     1 1 2   2     2     2 2 2 2     1 2 2 2   2           1 2   2 2   2           2           2       2       2       2     1 2     2 2 2         2 2       1                                               1                                                                         1                                                                                 1     1   1 1                         1       1                           1                                         1               1          
System.register(['core-js', './util', 'aurelia-binding'], function (_export) {
  'use strict';
 
  var core, hyphenate, bindingMode, BindableProperty, BehaviorPropertyObserver;
 
  function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 
  function getObserver(behavior, instance, name) {
    var lookup = instance.__observers__;
 
    if (lookup === undefined) {
      lookup = behavior.observerLocator.getOrCreateObserversLookup(instance);
      behavior.ensurePropertiesDefined(instance, lookup);
    }
 
    return lookup[name];
  }
 
  return {
    setters: [function (_coreJs) {
      core = _coreJs['default'];
    }, function (_util) {
      hyphenate = _util.hyphenate;
    }, function (_aureliaBinding) {
      bindingMode = _aureliaBinding.bindingMode;
    }],
    execute: function () {
      BindableProperty = (function () {
        function BindableProperty(nameOrConfig) {
          _classCallCheck(this, BindableProperty);
 
          Iif (typeof nameOrConfig === 'string') {
            this.name = nameOrConfig;
          } else {
            Object.assign(this, nameOrConfig);
          }
 
          this.attribute = this.attribute || hyphenate(this.name);
          this.defaultBindingMode = this.defaultBindingMode || bindingMode.oneWay;
          this.changeHandler = this.changeHandler || null;
          this.owner = null;
        }
 
        BindableProperty.prototype.registerWith = function registerWith(target, behavior, descriptor) {
          behavior.properties.push(this);
          behavior.attributes[this.attribute] = this;
          this.owner = behavior;
 
          Iif (descriptor) {
            this.descriptor = descriptor;
            return this.configureDescriptor(behavior, descriptor);
          }
        };
 
        BindableProperty.prototype.configureDescriptor = function configureDescriptor(behavior, descriptor) {
          var name = this.name;
 
          descriptor.configurable = true;
          descriptor.enumerable = true;
 
          Iif ('initializer' in descriptor) {
            this.defaultValue = descriptor.initializer;
            delete descriptor.initializer;
            delete descriptor.writable;
          }
 
          Iif ('value' in descriptor) {
            this.defaultValue = descriptor.value;
            delete descriptor.value;
            delete descriptor.writable;
          }
 
          descriptor.get = function () {
            return getObserver(behavior, this, name).getValue();
          };
 
          descriptor.set = function (value) {
            getObserver(behavior, this, name).setValue(value);
          };
 
          descriptor.get.getObserver = function (obj) {
            return getObserver(behavior, obj, name);
          };
 
          return descriptor;
        };
 
        BindableProperty.prototype.defineOn = function defineOn(target, behavior) {
          var name = this.name,
              handlerName;
 
          Eif (this.changeHandler === null) {
            handlerName = name + 'Changed';
            Iif (handlerName in target.prototype) {
              this.changeHandler = handlerName;
            }
          }
 
          Eif (!this.descriptor) {
            Object.defineProperty(target.prototype, name, this.configureDescriptor(behavior, {}));
          }
        };
 
        BindableProperty.prototype.createObserver = function createObserver(executionContext) {
          var _this = this;
 
          var selfSubscriber = null,
              defaultValue = this.defaultValue,
              initialValue;
 
          if (this.hasOptions) {
            return;
          }
 
          if (this.changeHandler !== null) {
            selfSubscriber = function (newValue, oldValue) {
              return executionContext[_this.changeHandler](newValue, oldValue);
            };
          }
 
          if (defaultValue !== undefined) {
            initialValue = typeof defaultValue === 'function' ? defaultValue.call(executionContext) : defaultValue;
          }
 
          return new BehaviorPropertyObserver(this.owner.taskQueue, executionContext, this.name, selfSubscriber, initialValue);
        };
 
        BindableProperty.prototype.initialize = function initialize(executionContext, observerLookup, attributes, behaviorHandlesBind, boundProperties) {
          var selfSubscriber,
              observer,
              attribute,
              defaultValue = this.defaultValue;
 
          if (this.isDynamic) {
            for (var key in attributes) {
              this.createDynamicProperty(executionContext, observerLookup, behaviorHandlesBind, key, attributes[key], boundProperties);
            }
          } else if (!this.hasOptions) {
            observer = observerLookup[this.name];
 
            if (attributes !== undefined) {
              selfSubscriber = observer.selfSubscriber;
              attribute = attributes[this.attribute];
 
              if (behaviorHandlesBind) {
                observer.selfSubscriber = null;
              }
 
              if (typeof attribute === 'string') {
                executionContext[this.name] = attribute;
                observer.call();
              } else if (attribute) {
                boundProperties.push({ observer: observer, binding: attribute.createBinding(executionContext) });
              } else if (defaultValue !== undefined) {
                observer.call();
              }
 
              observer.selfSubscriber = selfSubscriber;
            }
 
            observer.publishing = true;
          }
        };
 
        BindableProperty.prototype.createDynamicProperty = function createDynamicProperty(executionContext, observerLookup, behaviorHandlesBind, name, attribute, boundProperties) {
          var changeHandlerName = name + 'Changed',
              selfSubscriber = null,
              observer,
              info;
 
          if (changeHandlerName in executionContext) {
            selfSubscriber = function (newValue, oldValue) {
              return executionContext[changeHandlerName](newValue, oldValue);
            };
          } else if ('dynamicPropertyChanged' in executionContext) {
            selfSubscriber = function (newValue, oldValue) {
              return executionContext['dynamicPropertyChanged'](name, newValue, oldValue);
            };
          }
 
          observer = observerLookup[name] = new BehaviorPropertyObserver(this.owner.taskQueue, executionContext, name, selfSubscriber);
 
          Object.defineProperty(executionContext, name, {
            configurable: true,
            enumerable: true,
            get: observer.getValue.bind(observer),
            set: observer.setValue.bind(observer)
          });
 
          if (behaviorHandlesBind) {
            observer.selfSubscriber = null;
          }
 
          if (typeof attribute === 'string') {
            executionContext[name] = attribute;
            observer.call();
          } else if (attribute) {
            info = { observer: observer, binding: attribute.createBinding(executionContext) };
            boundProperties.push(info);
          }
 
          observer.publishing = true;
          observer.selfSubscriber = selfSubscriber;
        };
 
        return BindableProperty;
      })();
 
      _export('BindableProperty', BindableProperty);
 
      BehaviorPropertyObserver = (function () {
        function BehaviorPropertyObserver(taskQueue, obj, propertyName, selfSubscriber, initialValue) {
          _classCallCheck(this, BehaviorPropertyObserver);
 
          this.taskQueue = taskQueue;
          this.obj = obj;
          this.propertyName = propertyName;
          this.callbacks = [];
          this.notqueued = true;
          this.publishing = false;
          this.selfSubscriber = selfSubscriber;
          this.currentValue = this.oldValue = initialValue;
        }
 
        BehaviorPropertyObserver.prototype.getValue = function getValue() {
          return this.currentValue;
        };
 
        BehaviorPropertyObserver.prototype.setValue = function setValue(newValue) {
          var oldValue = this.currentValue;
 
          if (oldValue != newValue) {
            if (this.publishing && this.notqueued) {
              this.notqueued = false;
              this.taskQueue.queueMicroTask(this);
            }
 
            this.oldValue = oldValue;
            this.currentValue = newValue;
          }
        };
 
        BehaviorPropertyObserver.prototype.call = function call() {
          var callbacks = this.callbacks,
              i = callbacks.length,
              oldValue = this.oldValue,
              newValue = this.currentValue;
 
          this.notqueued = true;
 
          if (newValue != oldValue) {
            if (this.selfSubscriber !== null) {
              this.selfSubscriber(newValue, oldValue);
            }
 
            while (i--) {
              callbacks[i](newValue, oldValue);
            }
 
            this.oldValue = newValue;
          }
        };
 
        BehaviorPropertyObserver.prototype.subscribe = function subscribe(callback) {
          var callbacks = this.callbacks;
          callbacks.push(callback);
          return function () {
            callbacks.splice(callbacks.indexOf(callback), 1);
          };
        };
 
        return BehaviorPropertyObserver;
      })();
    }
  };
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9FaXNlbmJlcmdFZmZlY3QvRG9jdW1lbnRzL0dpdEh1Yi9UaGUgRHVyYW5kYWwgUHJvamVjdC9hdXJlbGlhL3RlbXBsYXRpbmcvc3JjL2JpbmRhYmxlLXByb3BlcnR5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztvQ0FlYSxnQkFBZ0IsRUF1S3ZCLHdCQUF3Qjs7OztBQWxMOUIsV0FBUyxXQUFXLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUM7QUFDNUMsUUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQzs7QUFFcEMsUUFBRyxNQUFNLEtBQUssU0FBUyxFQUFDO0FBQ3RCLFlBQU0sR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3ZFLGNBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDcEQ7O0FBRUQsV0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDckI7Ozs7Ozt3QkFaTyxTQUFTOztvQ0FDVCxXQUFXOzs7QUFhTixzQkFBZ0I7QUFDaEIsaUJBREEsZ0JBQWdCLENBQ2YsWUFBWSxFQUFDO2dDQURkLGdCQUFnQjs7QUFFekIsY0FBRyxPQUFPLFlBQVksS0FBSyxRQUFRLEVBQUM7QUFDbEMsZ0JBQUksQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDO1dBQzFCLE1BQUk7QUFDSCxrQkFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7V0FDbkM7O0FBRUQsY0FBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDeEQsY0FBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxXQUFXLENBQUMsTUFBTSxDQUFDO0FBQ3hFLGNBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEs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Q0FBQztBQUN6QixnQkFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUM7V0FDOUI7U0FDRjs7QUE1QkcsZ0NBQXdCLFdBOEI1QixJQUFJLEdBQUEsZ0JBQUU7QUFDSixjQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUztjQUMxQixDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU07Y0FDcEIsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRO2NBQ3hCLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDOztBQUVqQyxjQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQzs7QUFFdEIsY0FBRyxRQUFRLElBQUksUUFBUSxFQUFDO0FBQ3RCLGdCQUFHLElBQUksQ0FBQyxjQUFjLEtBQUssSUFBSSxFQUFDO0FBQzlCLGtCQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQzthQUN6Qzs7QUFFRCxtQkFBTSxDQUFDLEVBQUUsRUFBRTtBQUNULHVCQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2FBQ2xDOztBQUVELGdCQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztXQUMxQjtTQUNGOztBQWpERyxnQ0FBd0IsV0FtRDVCLFNBQVMsR0FBQSxtQkFBQyxRQUFRLEVBQUM7QUFDakIsY0FBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztBQUMvQixtQkFBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUN6QixpQkFBTyxZQUFVO0FBQ2YscUJBQVMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztXQUNsRCxDQUFDO1NBQ0g7O2VBekRHLHdCQUF3QiIsImZpbGUiOiIvVXNlcnMvRWlzZW5iZXJnRWZmZWN0L0RvY3VtZW50cy9HaXRIdWIvVGhlIER1cmFuZGFsIFByb2plY3QvYXVyZWxpYS90ZW1wbGF0aW5nL3NyYy9iaW5kYWJsZS1wcm9wZXJ0eS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjb3JlIGZyb20gJ2NvcmUtanMnO1xuaW1wb3J0IHtoeXBoZW5hdGV9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQge2JpbmRpbmdNb2RlfSBmcm9tICdhdXJlbGlhLWJpbmRpbmcnO1xuXG5mdW5jdGlvbiBnZXRPYnNlcnZlcihiZWhhdmlvciwgaW5zdGFuY2UsIG5hbWUpe1xuICB2YXIgbG9va3VwID0gaW5zdGFuY2UuX19vYnNlcnZlcnNfXztcblxuICBpZihsb29rdXAgPT09IHVuZGVmaW5lZCl7XG4gICAgbG9va3VwID0gYmVoYXZpb3Iub2JzZXJ2ZXJMb2NhdG9yLmdldE9yQ3JlYXRlT2JzZXJ2ZXJzTG9va3VwKGluc3RhbmNlKTtcbiAgICBiZWhhdmlvci5lbnN1cmVQcm9wZXJ0aWVzRGVmaW5lZChpbnN0YW5jZSwgbG9va3VwKTtcbiAgfVxuXG4gIHJldHVybiBsb29rdXBbbmFtZV07XG59XG5cbmV4cG9ydCBjbGFzcyBCaW5kYWJsZVByb3BlcnR5IHtcbiAgY29uc3RydWN0b3IobmFtZU9yQ29uZmlnKXtcbiAgICBpZih0eXBlb2YgbmFtZU9yQ29uZmlnID09PSAnc3RyaW5nJyl7XG4gICAgICB0aGlzLm5hbWUgPSBuYW1lT3JDb25maWc7XG4gICAgfWVsc2V7XG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMsIG5hbWVPckNvbmZpZyk7XG4gICAgfVxuXG4gICAgdGhpcy5hdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZSB8fCBoeXBoZW5hdGUodGhpcy5uYW1lKTtcbiAgICB0aGlzLmRlZmF1bHRCaW5kaW5nTW9kZSA9IHRoaXMuZGVmYXVsdEJpbmRpbmdNb2RlIHx8IGJpbmRpbmdNb2RlLm9uZVdheTtcbiAgICB0aGlzLmNoYW5nZUhhbmRsZXIgPSB0aGlzLmNoYW5nZUhhbmRsZXIgfHwgbnVsbDtcbiAgICB0aGlzLm93bmVyID0gbnVsbDtcbiAgfVxuXG4gIHJlZ2lzdGVyV2l0aCh0YXJnZXQsIGJlaGF2aW9yLCBkZXNjcmlwdG9yKXtcbiAgICBiZWhhdmlvci5wcm9wZXJ0aWVzLnB1c2godGhpcyk7XG4gICAgYmVoYXZpb3IuYXR0cmlidXRlc1t0aGlzLmF0dHJpYnV0ZV0gPSB0aGlzO1xuICAgIHRoaXMub3duZXIgPSBiZWhhdmlvcjtcblxuICAgIGlmKGRlc2NyaXB0b3Ipe1xuICAgICAgdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjtcbiAgICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyZURlc2NyaXB0b3IoYmVoYXZpb3IsIGRlc2NyaXB0b3IpO1xuICAgIH1cbiAgfVxuXG4gIGNvbmZpZ3VyZURlc2NyaXB0b3IoYmVoYXZpb3IsIGRlc2NyaXB0b3Ipe1xuICAgIHZhciBuYW1lID0gdGhpcy5uYW1lO1xuXG4gICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IHRydWU7XG5cbiAgICBpZignaW5pdGlhbGl6ZXInIGluIGRlc2NyaXB0b3Ipe1xuICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZXNjcmlwdG9yLmluaXRpYWxpemVyO1xuICAgICAgZGVsZXRlIGRlc2NyaXB0b3IuaW5pdGlhbGl6ZXI7XG4gICAgICBkZWxldGUgZGVzY3JpcHRvci53cml0YWJsZTtcbiAgICB9XG5cbiAgICBpZigndmFsdWUnIGluIGRlc2NyaXB0b3Ipe1xuICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZXNjcmlwdG9yLnZhbHVlO1xuICAgICAgZGVsZXRlIGRlc2NyaXB0b3IudmFsdWU7XG4gICAgICBkZWxldGUgZGVzY3JpcHRvci53cml0YWJsZTtcbiAgICB9XG5cbiAgICBkZXNjcmlwdG9yLmdldCA9IGZ1bmN0aW9uKCl7XG4gICAgICByZXR1cm4gZ2V0T2JzZXJ2ZXIoYmVoYXZpb3IsIHRoaXMsIG5hbWUpLmdldFZhbHVlKCk7XG4gICAgfTtcblxuICAgIGRlc2NyaXB0b3Iuc2V0ID0gZnVuY3Rpb24odmFsdWUpe1xuICAgICAgZ2V0T2JzZXJ2ZXIoYmVoYXZpb3IsIHRoaXMsIG5hbWUpLnNldFZhbHVlKHZhbHVlKTtcbiAgICB9O1xuXG4gICAgZGVzY3JpcHRvci5nZXQuZ2V0T2JzZXJ2ZXIgPSBmdW5jdGlvbihvYmope1xuICAgICAgcmV0dXJuIGdldE9ic2VydmVyKGJlaGF2aW9yLCBvYmosIG5hbWUpO1xuICAgIH07XG5cbiAgICByZXR1cm4gZGVzY3JpcHRvcjtcbiAgfVxuXG4gIGRlZmluZU9uKHRhcmdldCwgYmVoYXZpb3Ipe1xuICAgIHZhciBuYW1lID0gdGhpcy5uYW1lLFxuICAgICAgICBoYW5kbGVyTmFtZTtcblxuICAgIGlmKHRoaXMuY2hhbmdlSGFuZGxlciA9PT0gbnVsbCl7XG4gICAgICBoYW5kbGVyTmFtZSA9IG5hbWUgKyAnQ2hhbmdlZCc7XG4gICAgICBpZihoYW5kbGVyTmFtZSBpbiB0YXJnZXQucHJvdG90eXBlKXtcbiAgICAgICAgdGhpcy5jaGFuZ2VIYW5kbGVyID0gaGFuZGxlck5hbWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoIXRoaXMuZGVzY3JpcHRvcil7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LnByb3RvdHlwZSwgbmFtZSwgdGhpcy5jb25maWd1cmVEZXNjcmlwdG9yKGJlaGF2aW9yLCB7fSkpO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZU9ic2VydmVyKGV4ZWN1dGlvbkNvbnRleHQpe1xuICAgIHZhciBzZWxmU3Vic2NyaWJlciA9IG51bGwsIGRlZmF1bHRWYWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlLCBpbml0aWFsVmFsdWU7XG5cbiAgICBpZih0aGlzLmhhc09wdGlvbnMpe1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmKHRoaXMuY2hhbmdlSGFuZGxlciAhPT0gbnVsbCl7XG4gICAgICBzZWxmU3Vic2NyaWJlciA9IChuZXdWYWx1ZSwgb2xkVmFsdWUpID0+IGV4ZWN1dGlvbkNvbnRleHRbdGhpcy5jaGFuZ2VIYW5kbGVyXShuZXdWYWx1ZSwgb2xkVmFsdWUpO1xuICAgIH1cblxuICAgIGlmKGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKXtcbiAgICAgIGluaXRpYWxWYWx1ZSA9IHR5cGVvZiBkZWZhdWx0VmFsdWUgPT09ICdmdW5jdGlvbicgPyBkZWZhdWx0VmFsdWUuY2FsbChleGVjdXRpb25Db250ZXh0KSA6IGRlZmF1bHRWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEJlaGF2aW9yUHJvcGVydHlPYnNlcnZlcih0aGlzLm93bmVyLnRhc2tRdWV1ZSwgZXhlY3V0aW9uQ29udGV4dCwgdGhpcy5uYW1lLCBzZWxmU3Vic2NyaWJlciwgaW5pdGlhbFZhbHVlKTtcbiAgfVxuXG4gIGluaXRpYWxpemUoZXhlY3V0aW9uQ29udGV4dCwgb2JzZXJ2ZXJMb29rdXAsIGF0dHJpYnV0ZXMsIGJlaGF2aW9ySGFuZGxlc0JpbmQsIGJvdW5kUHJvcGVydGllcyl7XG4gICAgdmFyIHNlbGZTdWJzY3JpYmVyLCBvYnNlcnZlciwgYXR0cmlidXRlLCBkZWZhdWx0VmFsdWUgPSB0aGlzLmRlZmF1bHRWYWx1ZTtcblxuICAgIGlmKHRoaXMuaXNEeW5hbWljKXtcbiAgICAgIGZvcihsZXQga2V5IGluIGF0dHJpYnV0ZXMpe1xuICAgICAgICB0aGlzLmNyZWF0ZUR5bmFtaWNQcm9wZXJ0eShleGVjdXRpb25Db250ZXh0LCBvYnNlcnZlckxvb2t1cCwgYmVoYXZpb3JIYW5kbGVzQmluZCwga2V5LCBhdHRyaWJ1dGVzW2tleV0sIGJvdW5kUHJvcGVydGllcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKCF0aGlzLmhhc09wdGlvbnMpe1xuICAgICAgb2JzZXJ2ZXIgPSBvYnNlcnZlckxvb2t1cFt0aGlzLm5hbWVdO1xuXG4gICAgICBpZihhdHRyaWJ1dGVzICE9PSB1bmRlZmluZWQpe1xuICAgICAgICBzZWxmU3Vic2NyaWJlciA9IG9ic2VydmVyLnNlbGZTdWJzY3JpYmVyO1xuICAgICAgICBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzW3RoaXMuYXR0cmlidXRlXTtcblxuICAgICAgICBpZihiZWhhdmlvckhhbmRsZXNCaW5kKXtcbiAgICAgICAgICBvYnNlcnZlci5zZWxmU3Vic2NyaWJlciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZih0eXBlb2YgYXR0cmlidXRlID09PSAnc3RyaW5nJyl7XG4gICAgICAgICAgZXhlY3V0aW9uQ29udGV4dFt0aGlzLm5hbWVdID0gYXR0cmlidXRlO1xuICAgICAgICAgIG9ic2VydmVyLmNhbGwoKTtcbiAgICAgICAgfWVsc2UgaWYoYXR0cmlidXRlKXtcbiAgICAgICAgICBib3VuZFByb3BlcnRpZXMucHVzaCh7b2JzZXJ2ZXI6b2JzZXJ2ZXIsIGJpbmRpbmc6YXR0cmlidXRlLmNyZWF0ZUJpbmRpbmcoZXhlY3V0aW9uQ29udGV4dCl9KTtcbiAgICAgICAgfWVsc2UgaWYoZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpe1xuICAgICAgICAgIG9ic2VydmVyLmNhbGwoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9ic2VydmVyLnNlbGZTdWJzY3JpYmVyID0gc2VsZlN1YnNjcmliZXI7XG4gICAgICB9XG5cbiAgICAgIG9ic2VydmVyLnB1Ymxpc2hpbmcgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUR5bmFtaWNQcm9wZXJ0eShleGVjdXRpb25Db250ZXh0LCBvYnNlcnZlckxvb2t1cCwgYmVoYXZpb3JIYW5kbGVzQmluZCwgbmFtZSwgYXR0cmlidXRlLCBib3VuZFByb3BlcnRpZXMpe1xuICAgIHZhciBjaGFuZ2VIYW5kbGVyTmFtZSA9IG5hbWUgKyAnQ2hhbmdlZCcsXG4gICAgICAgIHNlbGZTdWJzY3JpYmVyID0gbnVsbCwgb2JzZXJ2ZXIsIGluZm87XG5cbiAgICBpZihjaGFuZ2VIYW5kbGVyTmFtZSBpbiBleGVjdXRpb25Db250ZXh0KXtcbiAgICAgIHNlbGZTdWJzY3JpYmVyID0gKG5ld1ZhbHVlLCBvbGRWYWx1ZSkgPT4gZXhlY3V0aW9uQ29udGV4dFtjaGFuZ2VIYW5kbGVyTmFtZV0obmV3VmFsdWUsIG9sZFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKCdkeW5hbWljUHJvcGVydHlDaGFuZ2VkJyBpbiBleGVjdXRpb25Db250ZXh0KSB7XG4gICAgICBzZWxmU3Vic2NyaWJlciA9IChuZXdWYWx1ZSwgb2xkVmFsdWUpID0+IGV4ZWN1dGlvbkNvbnRleHRbJ2R5bmFtaWNQcm9wZXJ0eUNoYW5nZWQnXShuYW1lLCBuZXdWYWx1ZSwgb2xkVmFsdWUpO1xuICAgIH1cblxuICAgIG9ic2VydmVyID0gb2JzZXJ2ZXJMb29rdXBbbmFtZV0gPSBuZXcgQmVoYXZpb3JQcm9wZXJ0eU9ic2VydmVyKFxuICAgICAgICB0aGlzLm93bmVyLnRhc2tRdWV1ZSxcbiAgICAgICAgZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgc2VsZlN1YnNjcmliZXJcbiAgICAgICAgKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleGVjdXRpb25Db250ZXh0LCBuYW1lLCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0OiBvYnNlcnZlci5nZXRWYWx1ZS5iaW5kKG9ic2VydmVyKSxcbiAgICAgIHNldDogb2JzZXJ2ZXIuc2V0VmFsdWUuYmluZChvYnNlcnZlcilcbiAgICB9KTtcblxuICAgIGlmKGJlaGF2aW9ySGFuZGxlc0JpbmQpe1xuICAgICAgb2JzZXJ2ZXIuc2VsZlN1YnNjcmliZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmKHR5cGVvZiBhdHRyaWJ1dGUgPT09ICdzdHJpbmcnKXtcbiAgICAgIGV4ZWN1dGlvbkNvbnRleHRbbmFtZV0gPSBhdHRyaWJ1dGU7XG4gICAgICBvYnNlcnZlci5jYWxsKCk7XG4gICAgfWVsc2UgaWYoYXR0cmlidXRlKXtcbiAgICAgIGluZm8gPSB7b2JzZXJ2ZXI6b2JzZXJ2ZXIsIGJpbmRpbmc6YXR0cmlidXRlLmNyZWF0ZUJpbmRpbmcoZXhlY3V0aW9uQ29udGV4dCl9O1xuICAgICAgYm91bmRQcm9wZXJ0aWVzLnB1c2goaW5mbyk7XG4gICAgfVxuXG4gICAgb2JzZXJ2ZXIucHVibGlzaGluZyA9IHRydWU7XG4gICAgb2JzZXJ2ZXIuc2VsZlN1YnNjcmliZXIgPSBzZWxmU3Vic2NyaWJlcjtcbiAgfVxufVxuXG5jbGFzcyBCZWhhdmlvclByb3BlcnR5T2JzZXJ2ZXIge1xuICBjb25zdHJ1Y3Rvcih0YXNrUXVldWUsIG9iaiwgcHJvcGVydHlOYW1lLCBzZWxmU3Vic2NyaWJlciwgaW5pdGlhbFZhbHVlKXtcbiAgICB0aGlzLnRhc2tRdWV1ZSA9IHRhc2tRdWV1ZTtcbiAgICB0aGlzLm9iaiA9IG9iajtcbiAgICB0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTtcbiAgICB0aGlzLmNhbGxiYWNrcyA9IFtdO1xuICAgIHRoaXMubm90cXVldWVkID0gdHJ1ZTtcbiAgICB0aGlzLnB1Ymxpc2hpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnNlbGZTdWJzY3JpYmVyID0gc2VsZlN1YnNjcmliZXI7XG4gICAgdGhpcy5jdXJyZW50VmFsdWUgPSB0aGlzLm9sZFZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICB9XG5cbiAgZ2V0VmFsdWUoKXtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50VmFsdWU7XG4gIH1cblxuICBzZXRWYWx1ZShuZXdWYWx1ZSl7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5jdXJyZW50VmFsdWU7XG5cbiAgICBpZihvbGRWYWx1ZSAhPSBuZXdWYWx1ZSl7XG4gICAgICBpZih0aGlzLnB1Ymxpc2hpbmcgJiYgdGhpcy5ub3RxdWV1ZWQpe1xuICAgICAgICB0aGlzLm5vdHF1ZXVlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnRhc2tRdWV1ZS5xdWV1ZU1pY3JvVGFzayh0aGlzKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlO1xuICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBjYWxsKCl7XG4gICAgdmFyIGNhbGxiYWNrcyA9IHRoaXMuY2FsbGJhY2tzLFxuICAgICAgICBpID0gY2FsbGJhY2tzLmxlbmd0aCxcbiAgICAgICAgb2xkVmFsdWUgPSB0aGlzLm9sZFZhbHVlLFxuICAgICAgICBuZXdWYWx1ZSA9IHRoaXMuY3VycmVudFZhbHVlO1xuXG4gICAgdGhpcy5ub3RxdWV1ZWQgPSB0cnVlO1xuXG4gICAgaWYobmV3VmFsdWUgIT0gb2xkVmFsdWUpe1xuICAgICAgaWYodGhpcy5zZWxmU3Vic2NyaWJlciAhPT0gbnVsbCl7XG4gICAgICAgIHRoaXMuc2VsZlN1YnNjcmliZXIobmV3VmFsdWUsIG9sZFZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgd2hpbGUoaS0tKSB7XG4gICAgICAgIGNhbGxiYWNrc1tpXShuZXdWYWx1ZSwgb2xkVmFsdWUpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm9sZFZhbHVlID0gbmV3VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgc3Vic2NyaWJlKGNhbGxiYWNrKXtcbiAgICB2YXIgY2FsbGJhY2tzID0gdGhpcy5jYWxsYmFja3M7XG4gICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIHJldHVybiBmdW5jdGlvbigpe1xuICAgICAgY2FsbGJhY2tzLnNwbGljZShjYWxsYmFja3MuaW5kZXhPZihjYWxsYmFjayksIDEpO1xuICAgIH07XG4gIH1cbn1cbiJdfQ==